<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: function monte_carlo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body bgcolor="#f0f0f8">
<dl><dt><a name="-MonteCarlo.monte_carlo"><strong>MonteCarlo.monte_carlo</strong></a> = monte_carlo(x_nums, fun, cons, bounds, random_times=100000)</dt><dd><tt>monte_carlo&nbsp;对整数规划问题使用「蒙特卡洛法」求满意解<br>
&nbsp;<br>
对于线性、非线性的整数规划，在一定计算量下可以考虑用&nbsp;蒙特卡洛法&nbsp;得到一个满意解。<br>
&nbsp;<br>
注意：蒙特卡洛法只能在一定次数的模拟中求一个满意解（通常不是最优的），而且对于每个变量必须给出有明确上下界的取值范围。<br>
&nbsp;<br>
问题模型：<br>
&nbsp;&nbsp;&nbsp;&nbsp;Minimize:&nbsp;&nbsp;&nbsp;fun(x)<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;to:&nbsp;cons(x)&nbsp;&lt;=&nbsp;0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x&nbsp;are&nbsp;integers)<br>
&nbsp;<br>
Parameters<br>
----------<br>
:param&nbsp;x_nums:&nbsp;`int`,&nbsp;未知数向量&nbsp;x&nbsp;的元素个数<br>
:param&nbsp;fun:&nbsp;&nbsp;`(x:&nbsp;list)&nbsp;-&gt;&nbsp;float`,&nbsp;要最小化的目标函数<br>
:param&nbsp;cons:&nbsp;`(x:&nbsp;list)&nbsp;-&gt;&nbsp;list`,&nbsp;小于等于&nbsp;0&nbsp;的约束条件<br>
:param&nbsp;bounds:&nbsp;`list`,&nbsp;各个&nbsp;x&nbsp;的取值范围<br>
:param&nbsp;random_times:&nbsp;`int`,&nbsp;随机模拟次数<br>
&nbsp;<br>
Returns<br>
-------<br>
:return:&nbsp;{"x":&nbsp;array([...]),&nbsp;"fun":&nbsp;...}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;x:&nbsp;最优解<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;fun:&nbsp;最优目标函数值<br>
&nbsp;<br>
Examples<br>
--------<br>
试求得如下整数规划问题的一个满意解：<br>
&nbsp;&nbsp;&nbsp;&nbsp;Min&nbsp;&nbsp;x_0&nbsp;+&nbsp;x_1<br>
&nbsp;&nbsp;&nbsp;&nbsp;s.t.&nbsp;2&nbsp;*&nbsp;x_0&nbsp;+&nbsp;x_1&nbsp;&lt;=&nbsp;6<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;*&nbsp;x_0&nbsp;+&nbsp;5&nbsp;*&nbsp;x_1&nbsp;&lt;=&nbsp;20<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x_0、x_1&nbsp;为整数)<br>
编写目标函数：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;fun&nbsp;=&nbsp;lambda&nbsp;x:&nbsp;x[0]&nbsp;+&nbsp;x[1]<br>
编写约束条件：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;cons&nbsp;=&nbsp;lambda&nbsp;x:&nbsp;[2&nbsp;*&nbsp;x[0]&nbsp;+&nbsp;x[1]&nbsp;-&nbsp;6,&nbsp;4&nbsp;*&nbsp;x[0]&nbsp;+&nbsp;5&nbsp;*&nbsp;x[1]&nbsp;-&nbsp;20]<br>
指定取值范围：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;bounds&nbsp;=&nbsp;[(0,&nbsp;100),&nbsp;(0,&nbsp;100)]<br>
调用蒙特卡洛法求解：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;monte_carlo(2,&nbsp;fun,&nbsp;cons,&nbsp;bounds)<br>
&nbsp;&nbsp;&nbsp;&nbsp;{'fun':&nbsp;4,&nbsp;'x':&nbsp;[1,&nbsp;3]}<br>
可以看的&nbsp;monte_carlo&nbsp;返回了一个满意解（事实上，这是个最优解，但一般情况下不是）。</tt></dd></dl>

</body></html>